home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d12
/
v10n07.arc
/
PALETTE.ARC
/
TUNNEL.ARC
/
TUNNEL.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-03-27
|
7KB
|
219 lines
/*-----------------------------------------------------------------
TUNNEL.C -- Palette Animation Using Windows 3.0 Palette Manager
(c) Charles Petzold, 1990
-----------------------------------------------------------------*/
#include <windows.h>
long FAR PASCAL WndProc (HWND, WORD, WORD, LONG) ;
int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,
LPSTR lpszCmdLine, int nCmdShow)
{
char szAppName [] = "Tunnel" ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
if (!hPrevInstance)
{
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = NULL ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = szAppName ;
wndclass.lpszClassName = szAppName ;
RegisterClass (&wndclass) ;
}
hwnd = CreateWindow (szAppName, "Tunnel: Palette Animation",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;
ShowWindow (hwnd, nCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
long FAR PASCAL WndProc (HWND hwnd, WORD message, WORD wParam, LONG lParam)
{
static HPALETTE hPal ;
static LOCALHANDLE hLocalMem ;
static LOGPALETTE *plp ;
static short cxClient, cyClient, iLevel ;
BOOL bPalSupport ;
HBRUSH hBrush ;
HDC hdc ;
long i ;
PAINTSTRUCT ps ;
RECT rc ;
WORD nGrayLevel ;
switch (message)
{
case WM_CREATE:
// Check for palette support
hdc = GetDC (hwnd) ;
bPalSupport = (RC_PALETTE & GetDeviceCaps (hdc, RASTERCAPS)) &&
(GetDeviceCaps (hdc, SIZEPALETTE) -
GetDeviceCaps (hdc, NUMRESERVED) > 128) ;
ReleaseDC (hwnd, hdc) ;
if (!bPalSupport)
{
MessageBox (hwnd, "Program requires palette support",
"Tunnel", MB_ICONEXCLAMATION | MB_OK) ;
DestroyWindow (hwnd) ;
return 0 ;
}
// Allocate memory for LOGPALETTE structure and lock it
hLocalMem = LocalAlloc (LMEM_MOVEABLE, sizeof (LOGPALETTE) +
255 * sizeof (PALETTEENTRY)) ;
plp = (LOGPALETTE *) LocalLock (hLocalMem) ;
// Initialize the fields of the LOGPALETTE structure
plp->palVersion = 0x300 ;
plp->palNumEntries = 128 ;
for (i = 0 ; i < 128 ; i++)
{
if (i < 64)
nGrayLevel = 4 * i ;
else
nGrayLevel = min (255, 4 * (128 - i)) ;
plp->palPalEntry[i].peRed = nGrayLevel ;
plp->palPalEntry[i].peGreen = nGrayLevel ;
plp->palPalEntry[i].peBlue = nGrayLevel ;
plp->palPalEntry[i].peFlags = PC_RESERVED ;
plp->palPalEntry[i + 128].peRed = nGrayLevel ;
plp->palPalEntry[i + 128].peGreen = nGrayLevel ;
plp->palPalEntry[i + 128].peBlue = nGrayLevel ;
plp->palPalEntry[i + 128].peFlags = PC_RESERVED ;
}
// Create the logical palette
hPal = CreatePalette (plp) ;
// Unlock the memory block
LocalUnlock (hLocalMem) ;
SetTimer (hwnd, 1, 50, NULL) ;
return 0 ;
case WM_SIZE:
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;
return 0 ;
case WM_TIMER:
plp = (LOGPALETTE *) LocalLock (hLocalMem) ;
iLevel = (iLevel + 1) % 128 ;
AnimatePalette (hPal, 0, 128, plp->palPalEntry + iLevel) ;
// Unlock the memory block
LocalUnlock (hLocalMem) ;
return 0 ;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
SelectPalette (hdc, hPal, FALSE) ;
RealizePalette (hdc) ;
for (i = 0 ; i < 127 ; i++)
{
// Use a RECT structure for each of 128 rectangles
rc.left = (short) ( i * cxClient / 255) ;
rc.top = (short) ( i * cyClient / 255) ;
rc.right = (short) (cxClient - i * cxClient / 255) ;
rc.bottom = (short) (cyClient - i * cyClient / 255) ;
hBrush = CreateSolidBrush (PALETTEINDEX (i)) ;
// Fill the rectangle and delete the brush
FillRect (hdc, &rc, hBrush) ;
DeleteObject (hBrush) ;
}
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_QUERYNEWPALETTE:
hdc = GetDC (hwnd) ;
SelectPalette (hdc, hPal, FALSE) ;
if (RealizePalette (hdc) > 0)
{
ReleaseDC (hwnd, hdc) ;
InvalidateRect (hwnd, NULL, FALSE) ;
return TRUE ;
}
else
{
ReleaseDC (hwnd, hdc) ;
return FALSE ;
}
break ;
case WM_PALETTECHANGED:
if (wParam != hwnd)
{
hdc = GetDC (hwnd) ;
SelectPalette (hdc, hPal, FALSE) ;
if (RealizePalette (hdc) > 0)
{
InvalidateRect (hwnd, NULL, FALSE) ;
}
ReleaseDC (hwnd, hdc) ;
}
return 0 ;
case WM_DESTROY :
KillTimer (hwnd, 1) ;
LocalFree (hLocalMem) ;
// Delete the logical palette
DeleteObject (hPal) ;
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}